#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
int g_val = 100;
int main()
{
    pid_t id = fork();
    if(id==0)
    {
        //child
        g_val = 200;
        printf("child:PID:%d, PPID:%d, g_val:%d, &g_val:%p\n", getpid(), getppid(), g_val, &g_val);
    }
    else if(id>0)
    {
        //father
        sleep(3);
        printf("father:PID:%d, PPID:%d, g_val:%d,&g_val:%p\n", getpid(), getppid(), g_val, &g_val);
    }
    else{
        //fork error
    }
    return 0;
}





//int g_unval;
//
//int main(int argc, char* argv[], char* envp[])
//{
//    printf("code addr:%p\n", main); //代码区
//    char* str = "hello world";  //只读常量区
//    printf("read only addr:%p\n", str); 
//    printf("init addr:%p\n", &g_val);   //初始化数据
//    static int n;
//    printf("static addr:%p\n", &n);
//    printf("uninit addr:%p\n", &g_unval);  //未初始化数据
//    int* p = (int*)malloc(10);
//    int* p2 = (int*)malloc(11);
//    printf("heap addr:%p\n", p);    //堆地址是否越开越大
//    printf("heap2 addr:%p\n", p2);
//    printf("stack addr:%p\n", &str);  //栈地址是否越开越小
//    printf("stack addr:%p\n", &p);
//    for(int i = 0;i<argc;i++)   //命令行参数
//    {
//        printf("args addr:%p\n", argv[i]);
//    }
//    int i = 0;
//    while(envp[i])  //环境变量
//    {
//        printf("env addr:%p\n", envp[i]);
//        i++;
//    }
//    return 0;
//}
